use eframe::egui;

use crate::shell::manager::ShellManager;
use crate::widgets::DraggableSeparator;

#[derive(Default)]
pub struct SimpleGui {
    terminal_text: String, // 上方：shell输出和历史（只读）
    cache_text: String,    // 下方：当前输入命令
    buddy_text: String,    // 右侧：小伙区域
    split_ratio: f32,
    shell_manager: ShellManager,
}

impl SimpleGui {
    pub fn new() -> Self {
        let mut shell_manager = ShellManager::new();
        // 启动shell进程
        if let Err(e) = shell_manager.start() {
            eprintln!("Failed to start shell: {}", e);
        } else {
            println!("Shell started successfully");
        }

        Self {
            terminal_text: "欢迎使用终端Buddy！\n在下方输入命令，按回车或点击\"执行\"按钮运行。\n\n支持的shell命令：\n- ls: 列出文件\n- pwd: 显示当前目录\n- cd: 切换目录\n- 其他标准shell命令".to_string(),
            cache_text: String::new(),
            buddy_text: String::new(),
            split_ratio: 0.5,
            shell_manager,
        }
    }
}

impl eframe::App for SimpleGui {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        // 更新shell输出
        self.update_shell_output();

        egui::CentralPanel::default().show(ctx, |ui| {
            let gui_width = ui.available_width();
            let separator_width = 8.0;
            let left_width = (gui_width - separator_width) * self.split_ratio;
            let right_width = (gui_width - separator_width) * (1.0 - self.split_ratio);

            ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| {
                // 左侧区域 - 垂直布局分为上下两部分
                ui.vertical(|ui| {
                    // 上方：shell输出和历史（只读）- 固定高度
                    let available_height = ui.available_height();
                    let output_height = available_height * 0.7;

                    // 使用Frame确保固定高度，即使内容很少也保持可见
                    egui::Frame::group(ui.style())
                        .fill(ui.visuals().extreme_bg_color)
                        .show(ui, |ui| {
                            ui.set_height(output_height);
                            ui.set_width(left_width);

                            egui::ScrollArea::vertical().show(ui, |ui| {
                                ui.add(
                                    egui::Label::new(&self.terminal_text)
                                        .wrap()
                                        .selectable(true),
                                );
                            });
                        });

                    // 下方：命令输入区域 - 固定高度
                    let input_height = available_height * 0.3;

                    ui.horizontal(|ui| {
                        let input_response = ui.add(
                            egui::TextEdit::singleline(&mut self.cache_text)
                                .id_source("terminal_input")
                                .hint_text("输入命令，按回车执行...")
                                .min_size(egui::Vec2::new(left_width - 60.0, input_height))
                                .desired_width(left_width - 60.0)
                                .desired_rows(
                                    (input_height / ui.text_style_height(&egui::TextStyle::Body))
                                        .floor()
                                        .max(1.0) as usize,
                                ),
                        );

                        // 执行按钮
                        if ui.button("执行").clicked() {
                            // 直接显示输入内容用于调试
                            self.terminal_text
                                .push_str(&format!("$ {}\n", self.cache_text));
                            self.execute_command();
                        }

                        // 处理回车键 - 只在输入框内检测
                        if input_response.has_focus() {
                            if ui.input(|i| i.key_pressed(egui::Key::Enter)) {
                                // 直接显示输入内容用于调试
                                self.terminal_text
                                    .push_str(&format!("$ {}\n", self.cache_text));
                                self.execute_command();
                            }
                        }
                    });
                });

                // 分割线 - 使用可拖动的分割线组件
                let separator_response = DraggableSeparator::new().show(ui, ui.available_height());

                // 检查分割线是否被拖动
                if separator_response.dragged() {
                    let drag_delta = separator_response.drag_delta().x;
                    let new_ratio = (left_width + drag_delta) / (gui_width - separator_width);
                    self.split_ratio = new_ratio.clamp(0.2, 0.8);
                }

                // 右侧文本区域
                ui.add(
                    egui::TextEdit::multiline(&mut self.buddy_text)
                        .id_source("buddy_area")
                        .hint_text("小伙区域...")
                        .min_size(egui::Vec2::new(200.0, 200.0))
                        .desired_width(right_width)
                        .desired_rows(
                            (ui.available_height() / ui.text_style_height(&egui::TextStyle::Body))
                                .floor()
                                .max(4.0) as usize,
                        ),
                );
            });
        });
    }
}

impl SimpleGui {
    /// 更新shell输出到终端文本
    fn update_shell_output(&mut self) {
        let output = self.shell_manager.get_output();
        if !output.is_empty() {
            self.terminal_text.push_str(&output);
            self.shell_manager.clear_output();
        }
    }

    /// 执行当前命令
    fn execute_command(&mut self) {
        let command = self.cache_text.trim().to_string();

        if command.is_empty() {
            return;
        }

        // 检查shell状态
        if !self.shell_manager.is_running() {
            self.terminal_text.push_str("[ERROR: Shell未运行]\n");
            self.cache_text.clear();
            return;
        }

        // 发送命令到shell
        if let Err(e) = self.shell_manager.send_command(&command) {
            self.terminal_text
                .push_str(&format!("[ERROR: 发送命令失败: {}]\n", e));
        } else {
            self.terminal_text
                .push_str(&format!("[命令已发送到shell: {}]\n", command));
        }

        // 清空输入区域
        self.cache_text.clear();
    }
}
